package work.jame.blog.service;

import work.jame.blog.framework.result.PageResult;
import work.jame.blog.pojo.User;
import com.baomidou.mybatisplus.extension.service.IService;
import work.jame.blog.pojo.dto.UserDTO;
import work.jame.blog.pojo.vo.PublishUserVO;
import work.jame.blog.pojo.vo.UserVO;

import java.util.List;

/**
 * 用户服务类
 *
 * @author Jame
 * @since 2023-05-09
 */
public interface UserService extends IService<User> {


    /**
     * 登录
     *
     * @param userDTO user数据包装类
     * @return 登录成功后返回jwt
     */
    String login(UserDTO userDTO);


    /**
     * 退出登录
     */
    void logout();

    /**
     * 注册账号
     * @param userDTO user数据包装类
     * @return boolean 注册是否成功
     */
    void register(UserDTO userDTO);

    /**
     * 生成登录验证码
     *
     * @param email 用户邮箱
     */
    void createLoginCode(String email);

    /**
     * 生成注册验证码
     *
     * @param email 用户邮箱
     */
    void createRegisterCode(String email);


    /**
     * 生成登录邮箱验证码
     * @param email
     */
    void createLoginEmailCode(String email);

    /**
     * 生成找回密码验证码
     *
     * @param email 用户邮箱
     */
    void createFindPasswordCode(String email);


    /**
     * 生成找回密码邮箱验证码
     * @param email
     */
    void createFindPasswordEmailCode(String email,String code);



    /**
     * 生成注册邮箱验证码
     *
     * @param email 用户邮箱
     * @param code  图片验证码
     */
    void createRegisterEmailCode(String email, String code);


    /**
     * 查询账号是否已经存在
     *
     * @param email 用户邮箱
     * @return boolean 邮箱是否已经存在
     */
    boolean queryEmailExist(String email);

    /**
     * 查询用户数据
     * @return userVO
     */
    UserVO queryUserInfo();

    /**
     * 重新设置密码
     * @param userDTO
     */
    void resetPassword(UserDTO userDTO);

    /**
     * 根据邮箱账号修改密码
     * @param email  用户邮箱
     * @param newPassword 新密码
     * @return 修改是否成功
     */
    boolean updatePasswordByEmail(String email,String newPassword);


    /**
     * 获取发布文章的用户信息
     * @param publishUserId 发布文章的用户id
     * @return PublishUserVO
     */
    PublishUserVO queryPublishUserInfo(Long publishUserId);

    /**
     * 根据用户id查询用户
     * @param userId 用户id
     * @return 用户对象
     */
    User queryUserById(Long userId);

    /**
     * 查询用户信息-只有米粒数量和id
     * @param userId 用户id
     * @return  用户对象
     */
    User queryUserRiceGrainNumber(Long userId);


    /**
     * 根据id更新用户米粒数量
     * @param user 需要更新的用户对象
     * @param oldRiceGrainNumber  原来的米粒数量
     * @return 更新是否成功
     */
    boolean updateUserRiceGrainNumberById(User user,Double oldRiceGrainNumber);

    /**
     * 查询当前用户的好友列表
     * 模糊查询8个用户根据昵称
     * @param nickName
     * @return
     */
    List<User> fuzzyQueryByUserNickNameLimit8(String nickName);


    /**
     * 更新用户数据
     * @param user user
     * @return boolean
     */

    boolean updateUserData(User user);


    /**
     * 修改头像
     * @param newAvatarName 新头像文件名称
     * @return boolean
     */
    boolean updateUserAvatar(String newAvatarName);


    /**
     * 根据关键字和分页查询用户
     * @param keyword 昵称
     * @param pageNumber 页数
     * @param pageSize 页大小
     * @return
     */
    PageResult<User> searchUserByNickName(String keyword,Long pageNumber,Long pageSize);
}
